home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / misc / emu / Apex-src.lha / FPP.68K < prev    next >
Text File  |  2001-09-30  |  30KB  |  1,202 lines

  1. ;FPP.68K    DEC-16-86
  2. ;FLOATING POINT PACKAGE
  3. ;WRITTEN BY LOREN BLANEY FOR DFM ENGINEERING
  4. ;
  5. ;REVISION HISTORY:
  6. ;APR-02-86, ORIGINAL
  7. ;SEP-OCT-86, CONVERTED TO ASM68K CONVENTIONS, AND MODIFIED
  8. ;
  9. ;NOTES:
  10. ;In addition to Motorola's and National's documentation, see "Stride 400
  11. ; Series Owner's Manual", page 250.
  12. ;
  13. ;This floating point package uses the National 32081 chip to emulate
  14. ; the Motorola 68881 chip (as ridiculous as this may seem). This package
  15. ; only emulates those features required by the XPL compiler. For
  16. ; example, only double precision is used, only MOVE instructions may
  17. ; reference memory, and many of the 68881 opcodes and addressing modes
  18. ; are not implemented.
  19. ;
  20. ;Motorola's 80-bit registers correspond to pairs of National's 32-bit
  21. ; registers. Thus, all internal calculations are done to 64 bits of
  22. ; precision.
  23. ;
  24. ;        Motorola    National (low word, high word)
  25. ;          FP0         R0,R1
  26. ;          FP1         R2,R3
  27. ;          FP2         R4,R5
  28. ;          FP3         R6,R7
  29. ;          FP4 *         R0,R1
  30. ;          FP5 *         R2,R3
  31. ;          FP6 *         R4,R5
  32. ;          FP7 *         R6,R7
  33. ;
  34. ; * FP4 through FP7 are not used here and represent a pseudo-stack
  35. ; overflow. FP0 is used as scratch and to return values from functions.
  36. ;
  37. ;Most of the Motorola opcodes operate register-to-register and have the
  38. ; following format:
  39. ;
  40. ;      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  41. ;      | 1   1   1   1 | 0   0   1   0 | 0   0   0   0 | 0   0   0   0 |
  42. ;      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  43. ;      | 0   0   0   S | S   S   D   D | D   X   X   X | X   X   X   X |
  44. ;      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  45. ;
  46. ;The MOVE double precision from memory to register opcode has the format
  47. ;
  48. ;      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  49. ;      | 1   1   1   1 | 0   0   1   0 | 0   0   M   M | M   A   A   A |
  50. ;      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  51. ;      | 0   1   0   1 | 0   1   D   D | D   0   0   0 | 0   0   0   0 |
  52. ;      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  53. ;
  54. ;The MOVE double precision from register to memory opcode has the format
  55. ;
  56. ;      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  57. ;      | 1   1   1   1 | 0   0   1   0 | 0   0   M   M | M   A   A   A |
  58. ;      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  59. ;      | 0   1   1   1 | 0   1   S   S | S   0   0   0 | 0   0   0   0 |
  60. ;      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  61. ;
  62. ;Where:
  63. ;    S = Source floating point register (FP0-FP7)
  64. ;    D = Destination floating point register (FP0-FP7)
  65. ;    X = Opcode type
  66. ;    M = Effective address mode
  67. ;    A = Effective address register
  68. ;
  69. ;
  70. ;
  71. ;All calculations are done using double precision, 64-bit, arithmetic,
  72. ; which is represented as follows:
  73. ;
  74. ;    63  62          52  51                                       0
  75. ;      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  76. ;      | S |Biased exponent|              Mantissa               |
  77. ;      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  78. ;     1       11                     52
  79. ;
  80. ; S = Sign of the Mantissa (8 = positive)
  81. ; Biased exponent. The bias = 1023 (= $3FF), approximately = 1E308.
  82. ; Mantissa. There is an implied "1." in front of these mantissa bits.
  83. ;    52 bits gives 15.6 decimal digits of precision.
  84. ;
  85. ;Some examples of how decimal numbers are represented makes this clear:
  86. ;
  87. ;    Decimal        S    Exponent        Mantissa
  88. ;
  89. ;      1.0        0      $3FF        $0 0000 0000 0000
  90. ;      2.0        0      $400        $0 0000 0000 0000
  91. ;      1.5        0      $3FF        $8 0000 0000 0000
  92. ;      2.5        0      $400        $4 0000 0000 0000
  93. ;      3.0        0      $400        $8 0000 0000 0000
  94. ;       .75        0      $3FE        $8 0000 0000 0000
  95. ;      0.0        0      $000        $0 0000 0000 0000
  96. ;     -1.5        1      $3FF        $8 0000 0000 0000
  97. ;     -6.5        1      $401        $A 0000 0000 0000
  98. ;     10.0        0      $402        $4 0000 0000 0000
  99. ;
  100.  
  101.     NOLIST
  102.     INCLUDE    SYSPAG        ;GET THE SYSTEM PAGE DEFINITIONS
  103.     LIST
  104.  
  105. ;NATIONAL'S 32081 FLOATING POINT UNIT (FPU) REGISTER ADDRESSES:
  106. FPU1    EQU    $FFFFC010    ;I/O PORT FOR OPERATION WORD & OPERANDS
  107. FPU2    EQU    $FFFFC020    ;INPUT PORT FOR PSR (STATUS REG WORD)
  108. FPU3    EQU    $FFFFC030    ;OUTPUT PORT FOR ID BYTE
  109. FPUSTAT    EQU    $FFFFC041    ;INPUT BIT 0 (TRUE HIGH)
  110.                 ; = OPERATION COMPLETE
  111. FPURSET    EQU    $FFFFC1C5    ;OUTPUT BIT 1 (TRUE LOW)
  112.                 ; = FPU HARDWARE RESET
  113.  
  114.     ORG    $2C        ;POINT LINE "F" EMULATOR TO THIS ROUTINE
  115.     DC.L    FLINE
  116.  
  117.     ORG    $20000
  118.  
  119. ; ;=======================================================================
  120. ;F-LINE EXCEPTION HANDLER
  121. ;
  122. ;If the 68000 tries to execute a floating point instruction (and there
  123. ; is no 68881 coprocessor) an F-line exception will occur which vectors
  124. ; to this routine.
  125. ;
  126. ;After the exception and register save (MOVEM.L), the stack looks like
  127. ; this:
  128. ;
  129. ; addresses increase
  130. ; going down  |
  131. ;          |
  132. ;          V
  133. ;        |        |
  134. ;        +-------+-------+
  135. ;        | D0 (hi)    |    <-- final SP
  136. ;        +-------+-------+
  137. ;        | D0 (lo)    |    2
  138. ;        +-------+-------+
  139. ;        | D1 (hi)    |    4
  140. ;        +-------+-------+
  141. ;        | D1 (lo)    |    6
  142. ;        +-------+-------+
  143. ;        | A6 (hi)    |    8
  144. ;        +-------+-------+
  145. ;        | A6 (lo)    |    10
  146. ;        +-------+-------+
  147. ;        | status reg    |    12
  148. ;        +-------+-------+
  149. ;        | ret addr (hi)    |    14
  150. ;        +-------+-------+
  151. ;        | ret addr (lo)    |    16
  152. ;        +-------+-------+
  153. ;initial SP --> |        |    18
  154. ;
  155. ;
  156. ;Initially, the return address on the stack points directly to the first
  157. ; word of the floating point instruction, the word that caused the
  158. ; F-line trap. In some places BRAs have been used in place of BSRs to
  159. ; make the stack offsets less confusing and to speed things up slightly.
  160. ;
  161. TEMP    DS.L    2        ;TEMPORARY SCRATCH FOR (SP)+ OPERATION
  162.  
  163. FLINE    MOVEM.L    D0/D1/A6,-(SP)    ;SAVE REGISTERS
  164.  
  165.     MOVEA.L    14(SP),A6    ;GET THE RETURN ADDRESS
  166.     ADDQ.L    #2,A6        ;POINT TO SECOND WORD OF INSTRUCTION
  167.     MOVE.W    (A6)+,D0    ;GET THE SECOND WORD AND POINT A6 TO
  168.                 ; THE THIRD WORD
  169.     MOVE.L    A6,14(SP)    ;FIX THE RETURN ADDRESS TO SKIP THE
  170.                 ; FIRST AND SECOND WORDS
  171.     ORI    #$0700,SR    ;32081 CHIP CANNOT BE INTERRUPTED
  172.     BTST    #14,D0        ;IS IT A MEMORY-REFERENCE INSTRUCTION?
  173.     BEQ.S    FLINE40        ;BRANCH IF NOT -- IT'S A CALCULATION
  174.  
  175.     BTST    #12,D0        ;IS IT A FIX OR FLOAT INSTRUCTION?
  176.                 ;I.E. IS THE SOURCE SPECIFIER (OR THE
  177.                 ; DESTINATION FORMAT) LONG WORD?
  178.     BNE.S    FLINE10        ;BRANCH IF NOT
  179.  
  180.     BTST    #13,D0        ;IS IT A FLOAT (MEMORY-TO-REGISTER)
  181.     BNE.S    FLINE05        ; INSTRUCTION?  BRANCH IF NOT
  182.     BRA    FLOAT        ;FMOVE.L D0,FP0
  183.  
  184. FLINE05    BRA    FIX        ;FMOVE.L FP0,D0
  185.  
  186. ;DISPATCH TO ROUTINE TO COMPUTE EFFECTIVE ADDRESS, WHICH IS PUT INTO A6
  187. FLINE10    MOVE.W    -4(A6),D1    ;GET FIRST WORD OF OPCODE
  188.     ANDI.W    #$003F,D1    ;MASK OFF THE EFFECTIVE ADDRESS BITS
  189.     ADD.B    D1,D1        ;TIMES 2 FOR WORD ENTRIES IN JUMP TABLE
  190.     LEA    EATBL-@-2(PC),A6 ;GET THE ADDRESS OF THE JUMP TABLE
  191.     MOVEA.W    0(A6,D1),A6    ;GET THE RELATIVE ADDRESS OF THE ROUTINE
  192.     JMP    EATBL-@-2(PC,A6) ;JUMP TO ROUTINE TO COMPUTE EFFECTIVE
  193.                 ; ADDRESS
  194. FLINE15    MOVEA.L    14(SP),A6    ;GET "RETURN ADDR", WHICH POINTS TO
  195.                 ; DISPLACEMENT
  196.     ADD.W    (A6)+,D1    ;ADD DISPLACEMENT (d) FROM OPCODE
  197.     MOVE.L    A6,14(SP)    ;ADJUST RETURN ADDRESS TO SKIP
  198.     MOVEA.L    D1,A6        ; DISPLACEMENT
  199.  
  200. FLINE20    ADDQ.L    #8,A6        ;POINT A6 TO LAST MEMORY LOCATION +1
  201.  
  202.     BTST    #13,D0        ;IS IT A MEMORY-TO-REGISTER OPCODE?
  203.     BNE    MOVRM        ;BRANCH IF NOT; MOVE REGISTER TO MEMORY
  204.     BRA    MOVMR        ;MOVE VALUE IN MEMORY INTO A REGISTER
  205.  
  206. FLINE40    MOVEQ    #0,D1        ;CLEAR HIGH-ORDER BYTE FOR INDEX INSTR.
  207.     MOVE.B    D0,D1        ;SAVE FUNCTION CODE BITS IN D1
  208.  
  209.     LSR.W    #6,D0        ;CONVERT MOTOROLA SOURCE AND DESTINATION
  210.     ANDI.W    #$003E,D0    ; BITS INTO NATIONAL "GEN" BITS
  211.     LEA    GENTBL-@-2(PC),A6 ;GET ADDRESS OF TABLE
  212.     MOVE.W    0(A6,D0),D0    ;GET "GEN" BITS FROM TABLE
  213.  
  214. ;DISPATCH TO ROUTINE TO HANDLE OPCODE
  215.     ADD.B    D1,D1        ;TIMES 2 FOR WORD ENTRIES 
  216.     BPL.S    FLINE50        ;BRANCH IF BIT 7 IS CLEAR
  217.     JSR    VERROR        ;EXTENSION CODES $40-$7F ARE UNUSED
  218.     ASCII    '140 - ILLEGAL FLOATING INSTRUCTIO'
  219.     DC.B    'N'+$80
  220.     BRA.S    FLINE90        ;EXIT
  221.  
  222. FLINE50    LEA    OPTBL-@-2(PC),A6 ;GET THE ADDRESS OF THE JUMP TABLE
  223.     MOVEA.W    0(A6,D1),A6    ;GET THE RELATIVE ADDRESS OF THE ROUTINE
  224.     ADDA.L    #OPTBL,A6    ;ADD "OPTBL" TO GET THE ABSOLUTE ADDRESS
  225.                                 ;??????
  226.     JMP    (A6)        ;JUMP TO ROUTINE TO HANDLE OPCODE
  227.  
  228. FLINE90    MOVEM.L    (SP)+,D0/D1/A6    ;RESTORE REGISTERS
  229.     RTE            ;RETURN FROM F-LINE EXCEPTION
  230.  
  231. ;----------------------------------------------------------------------
  232. ;TABLE TO DISPATCH TO EFFECTIVE ADDRESS ROUTINE
  233. ;
  234. EATBL    DC.W    EA00 -EATBL    ;%00    (% = OCTAL)
  235.     DC.W    EA01 -EATBL    ;%01
  236.     DC.W    EA02 -EATBL    ;%02
  237.     DC.W    EA03 -EATBL    ;%03
  238.     DC.W    EA04 -EATBL    ;%04
  239.     DC.W    EA05 -EATBL    ;%05
  240.     DC.W    EA06 -EATBL    ;%06
  241.     DC.W    EA07 -EATBL    ;%07
  242.  
  243.     DC.W    EA10 -EATBL    ;%10
  244.     DC.W    EA11 -EATBL    ;%11
  245.     DC.W    EA12 -EATBL    ;%12
  246.     DC.W    EA13 -EATBL    ;%13
  247.     DC.W    EA14 -EATBL    ;%14
  248.     DC.W    EA15 -EATBL    ;%15
  249.     DC.W    EA16 -EATBL    ;%16
  250.     DC.W    EA17 -EATBL    ;%17
  251.  
  252.     DC.W    EA20 -EATBL    ;%20
  253.     DC.W    EA21 -EATBL    ;%21
  254.     DC.W    EA22 -EATBL    ;%22
  255.     DC.W    EA23 -EATBL    ;%23
  256.     DC.W    EA24 -EATBL    ;%24
  257.     DC.W    EA25 -EATBL    ;%25
  258.     DC.W    EA26 -EATBL    ;%26
  259.     DC.W    EA27 -EATBL    ;%27
  260.  
  261.     DC.W    EA30 -EATBL    ;%30
  262.     DC.W    EA31 -EATBL    ;%31
  263.     DC.W    EA32 -EATBL    ;%32
  264.     DC.W    EA33 -EATBL    ;%33
  265.     DC.W    EA34 -EATBL    ;%34
  266.     DC.W    EA35 -EATBL    ;%35
  267.     DC.W    EA36 -EATBL    ;%36
  268.     DC.W    EA37 -EATBL    ;%37
  269.  
  270.     DC.W    EA40 -EATBL    ;%40
  271.     DC.W    EA41 -EATBL    ;%41
  272.     DC.W    EA42 -EATBL    ;%42
  273.     DC.W    EA43 -EATBL    ;%43
  274.     DC.W    EA44 -EATBL    ;%44
  275.     DC.W    EA45 -EATBL    ;%45
  276.     DC.W    EA46 -EATBL    ;%46
  277.     DC.W    EA47 -EATBL    ;%47
  278.  
  279.     DC.W    EA50 -EATBL    ;%50
  280.     DC.W    EA51 -EATBL    ;%51
  281.     DC.W    EA52 -EATBL    ;%52
  282.     DC.W    EA53 -EATBL    ;%53
  283.     DC.W    EA54 -EATBL    ;%54
  284.     DC.W    EA55 -EATBL    ;%55
  285.     DC.W    EA56 -EATBL    ;%56
  286.     DC.W    EA57 -EATBL    ;%57
  287.  
  288.     DC.W    EA60 -EATBL    ;%60
  289.     DC.W    EA61 -EATBL    ;%61
  290.     DC.W    EA62 -EATBL    ;%62
  291.     DC.W    EA63 -EATBL    ;%63
  292.     DC.W    EA64 -EATBL    ;%64
  293.     DC.W    EA65 -EATBL    ;%65
  294.     DC.W    EA66 -EATBL    ;%66
  295.     DC.W    EA67 -EATBL    ;%67
  296.  
  297.     DC.W    EA70 -EATBL    ;%70
  298.     DC.W    EA71 -EATBL    ;%71
  299.     DC.W    EA72 -EATBL    ;%72
  300.     DC.W    EA73 -EATBL    ;%73
  301.     DC.W    EA74 -EATBL    ;%74
  302.     DC.W    EA75 -EATBL    ;%75
  303.     DC.W    EA76 -EATBL    ;%76
  304.     DC.W    EA77 -EATBL    ;%77
  305.  
  306. ;-----------------------------------------------------------------------
  307. ;TABLE FOR CONVERTING MOTOROLA SOURCE AND DESTINATION REGISTER BITS INTO
  308. ; NATIONAL "GEN1" AND "GEN2" COMMAND WORDS.
  309. ;                SSS DDD         GEN1 GEN2
  310. GENTBL    DC.W    $0000        ;0/4 0        0 0
  311.     DC.W    $8000        ;0/4 1        0 2
  312.     DC.W    $0001        ;0/4 2        0 4
  313.     DC.W    $8001        ;0/4 3        0 6
  314.     DC.W    $0000        ;0/4 4        0 0
  315.     DC.W    $8000        ;0/4 5        0 2
  316.     DC.W    $0001        ;0/4 6        0 4
  317.     DC.W    $8001        ;0/4 7        0 6
  318.  
  319.     DC.W    $0010        ;1/5 0        2 0
  320.     DC.W    $8010        ;1/5 1        2 2
  321.     DC.W    $0011        ;1/5 2        2 4
  322.     DC.W    $8011        ;1/5 3        2 6
  323.     DC.W    $0010        ;1/5 4        2 0
  324.     DC.W    $8010        ;1/5 5        2 2
  325.     DC.W    $0011        ;1/5 6        2 4
  326.     DC.W    $8011        ;1/5 7        2 6
  327.  
  328.     DC.W    $0020        ;2/6 0        4 0
  329.     DC.W    $8020        ;2/6 1        4 2
  330.     DC.W    $0021        ;2/6 2        4 4
  331.     DC.W    $8021        ;2/6 3        4 6
  332.     DC.W    $0020        ;2/6 4        4 0
  333.     DC.W    $8020        ;2/6 5        4 2
  334.     DC.W    $0021        ;2/6 6        4 4
  335.     DC.W    $8021        ;2/6 7        4 6
  336.  
  337.     DC.W    $0030        ;3/7 0        6 0
  338.     DC.W    $8030        ;3/7 1        6 2
  339.     DC.W    $0031        ;3/7 2        6 4
  340.     DC.W    $8031        ;3/7 3        6 6
  341.     DC.W    $0030        ;3/7 4        6 0
  342.     DC.W    $8030        ;3/7 5        6 2
  343.     DC.W    $0031        ;3/7 6        6 4
  344.     DC.W    $8031        ;3/7 7        6 6
  345.  
  346. ;-----------------------------------------------------------------------
  347. ;JUMP TABLE FOR MOTOROLA 68881 OPCODES:
  348. ;
  349. OPTBL    DC.W    MOVE -OPTBL    ;$00
  350.     DC.W    INT -OPTBL    ;$01
  351.     DC.W    SINH -OPTBL    ;$02
  352.     DC.W    INTRZ -OPTBL    ;$03
  353.     DC.W    SQRT -OPTBL    ;$04
  354.     DC.W    BAD -OPTBL    ;$05
  355.     DC.W    LOGNP1 -OPTBL    ;$06
  356.     DC.W    BAD -OPTBL    ;$07
  357.     DC.W    ETOXM1 -OPTBL    ;$08
  358.     DC.W    TANH -OPTBL    ;$09
  359.     DC.W    ATAN -OPTBL    ;$0A
  360.     DC.W    BAD -OPTBL    ;$0B
  361.     DC.W    ASIN -OPTBL    ;$0C
  362.     DC.W    ATANH -OPTBL    ;$0D
  363.     DC.W    SIN -OPTBL    ;$0E
  364.     DC.W    TAN -OPTBL    ;$0F
  365.  
  366.     DC.W    ETOX -OPTBL    ;$10
  367.     DC.W    TWOTOX -OPTBL    ;$11
  368.     DC.W    TENTOX -OPTBL    ;$12
  369.     DC.W    BAD -OPTBL    ;$13
  370.     DC.W    LOGN -OPTBL    ;$14
  371.     DC.W    LOG10 -OPTBL    ;$15
  372.     DC.W    LOG2 -OPTBL    ;$16
  373.     DC.W    BAD -OPTBL    ;$17
  374.     DC.W    ABS -OPTBL    ;$18
  375.     DC.W    COSH -OPTBL    ;$19
  376.     DC.W    NEG -OPTBL    ;$1A
  377.     DC.W    BAD -OPTBL    ;$1B
  378.     DC.W    ACOS -OPTBL    ;$1C
  379.     DC.W    COS -OPTBL    ;$1D
  380.     DC.W    GETEXP -OPTBL    ;$1E
  381.     DC.W    GETMAN -OPTBL    ;$1F
  382.  
  383.     DC.W    DIV -OPTBL    ;$20
  384.     DC.W    MOD -OPTBL    ;$21
  385.     DC.W    ADD -OPTBL    ;$22
  386.     DC.W    MUL -OPTBL    ;$23
  387.     DC.W    SGLDIV -OPTBL    ;$24
  388.     DC.W    REM -OPTBL    ;$25
  389.     DC.W    SCALE -OPTBL    ;$26
  390.     DC.W    SGLMUL -OPTBL    ;$27
  391.     DC.W    SUB -OPTBL    ;$28
  392.     DC.W    BAD -OPTBL    ;$29
  393.     DC.W    BAD -OPTBL    ;$2A
  394.     DC.W    BAD -OPTBL    ;$2B
  395.     DC.W    BAD -OPTBL    ;$2C
  396.     DC.W    BAD -OPTBL    ;$2D
  397.     DC.W    BAD -OPTBL    ;$2E
  398.     DC.W    BAD -OPTBL    ;$2F
  399.  
  400.     DC.W    SINCOS -OPTBL    ;$30
  401.     DC.W    SINCOS -OPTBL    ;$31
  402.     DC.W    SINCOS -OPTBL    ;$32
  403.     DC.W    SINCOS -OPTBL    ;$33
  404.     DC.W    SINCOS -OPTBL    ;$34
  405.     DC.W    SINCOS -OPTBL    ;$35
  406.     DC.W    SINCOS -OPTBL    ;$36
  407.     DC.W    SINCOS -OPTBL    ;$37
  408.     DC.W    CMP -OPTBL    ;$38
  409.     DC.W    BAD -OPTBL    ;$39
  410.     DC.W    TST -OPTBL    ;$3A
  411.     DC.W    BAD -OPTBL    ;$3B
  412.     DC.W    BAD -OPTBL    ;$3C
  413.     DC.W    BAD -OPTBL    ;$3D
  414.     DC.W    BAD -OPTBL    ;$3E
  415.     DC.W    BAD -OPTBL    ;$3F
  416.  
  417. ;=======================================================================
  418. ;EFFECTIVE ADDRESS = D0-D7
  419. ;
  420. EA00
  421. EA01
  422. EA02
  423. EA03
  424. EA04
  425. EA05
  426. EA06
  427. EA07    JSR    VERROR
  428.     ASCII    '141 - UNIMPLEMENTED ADDR MODE, D'
  429.     DC.B    'n'+$80
  430.     BRA    FLINE90        ;EXIT
  431.  
  432. ;-----------------------------------------------------------------------
  433. ;EFFECTIVE ADDRESS = A0-A7
  434. ;
  435. EA10
  436. EA11
  437. EA12
  438. EA13
  439. EA14
  440. EA15
  441. EA16
  442. EA17    JSR    VERROR
  443.     ASCII    '142 - UNIMPLEMENTED ADDR MODE, A'
  444.     DC.B    'n'+$80
  445.     BRA    FLINE90        ;EXIT
  446.  
  447. ;-----------------------------------------------------------------------
  448. ;EFFECTIVE ADDRESS = (An)
  449. ; RETURN EFFECTIVE ADDRESS IN A6
  450. ;
  451. EA20    MOVEA.L    A0,A6
  452.     BRA    FLINE20
  453.  
  454. EA21    MOVEA.L    A1,A6
  455.     BRA    FLINE20
  456.  
  457. EA22    MOVEA.L    A2,A6
  458.     BRA    FLINE20
  459.  
  460. EA23    MOVEA.L    A3,A6
  461.     BRA    FLINE20
  462.  
  463. EA24    MOVEA.L    A4,A6
  464.     BRA    FLINE20
  465.  
  466. EA25    MOVEA.L    A5,A6
  467.     BRA    FLINE20
  468.  
  469. EA26    MOVEA.L    8(SP),A6    ;GET A6 AS SAVED ON THE STACK
  470.     BRA    FLINE20
  471.  
  472. EA27    LEA    18(SP),A6    ;IF WE WERE IN SUPERVISOR MODE
  473.     BRA    FLINE20        ;ADJUST SP TO VALUE BEFORE THE EXCEPTION
  474.  
  475. ;EA27    MOVE    USP,A6        ;IF WE WERE IN USRE MODE
  476. ;    BRA    FLINE20
  477.  
  478. ;-----------------------------------------------------------------------
  479. ;EFFECTIVE ADDRESS = (An)+
  480. ; RETURN EFFECTIVE ADDRESS IN A6
  481. ; D1 MAY BE DESTROYED
  482. ;
  483. EA30    MOVEA.L    A0,A6
  484.     ADDQ.L    #8,A0
  485.     BRA    FLINE20
  486.  
  487. EA31    MOVEA.L    A1,A6
  488.     ADDQ.L    #8,A1
  489.     BRA    FLINE20
  490.  
  491. EA32    MOVEA.L    A2,A6
  492.     ADDQ.L    #8,A2
  493.     BRA    FLINE20
  494.  
  495. EA33    MOVEA.L    A3,A6
  496.     ADDQ.L    #8,A3
  497.     BRA    FLINE20
  498.  
  499. EA34    MOVEA.L    A4,A6
  500.     ADDQ.L    #8,A4
  501.     BRA    FLINE20
  502.  
  503. EA35    MOVEA.L    A5,A6
  504.     ADDQ.L    #8,A5
  505.     BRA    FLINE20
  506.  
  507. EA36    MOVEA.L    8(SP),A6
  508.     ADDQ.L    #8,8(SP)
  509.     BRA    FLINE20
  510.  
  511. ;This is a pull operation: We discard the real value that is on the
  512. ; stack just after this exception stuff. (A real mess.)
  513. ;WARNING: This assumes the exception occurred while in supervisor mode
  514. EA37    MOVEM.L    18(SP),D1/A6    ;GET THE REAL VALUE
  515.     MOVE.L    14(SP),22(SP)    ;MOVE THE EXCEPTION INFO AHEAD,
  516.     MOVE.L    10(SP),18(SP)    ; EFFECTIVELY PULLING THE REAL VALUE
  517.     MOVE.L    6(SP),14(SP)
  518.     MOVE.L    2(SP),10(SP)
  519.     MOVE.W    (SP),8(SP)
  520.     MOVEM.L    D1/A6,TEMP.L    ;NEED TO PUT VALUE SOMEWHERE
  521.     LEA    TEMP.L,A6    ;POINT TO VALUE
  522.     ADDQ.L    #8,SP        ;ADJUST SP FOR PULL
  523.     BRA    FLINE20
  524.  
  525. ;-----------------------------------------------------------------------
  526. ;EFFECTIVE ADDRESS = -(An)
  527. ; RETURN EFFECTIVE ADDRESS IN A6
  528. ; D1 MAY BE DESTROYED
  529. ;
  530. EA40    SUBQ.L    #8,A0
  531.     MOVEA.L    A0,A6
  532.     BRA    FLINE20
  533.  
  534. EA41    SUBQ.L    #8,A1
  535.     MOVEA.L    A1,A6
  536.     BRA    FLINE20
  537.  
  538. EA42    SUBQ.L    #8,A2
  539.     MOVEA.L    A2,A6
  540.     BRA    FLINE20
  541.  
  542. EA43    SUBQ.L    #8,A3
  543.     MOVEA.L    A3,A6
  544.     BRA    FLINE20
  545.  
  546. EA44    SUBQ.L    #8,A4
  547.     MOVEA.L    A4,A6
  548.     BRA    FLINE20
  549.  
  550. EA45    SUBQ.L    #8,A5
  551.     MOVEA.L    A5,A6
  552.     BRA    FLINE20
  553.  
  554. EA46    SUBQ.L    #8,8(SP)
  555.     MOVEA.L    8(SP),A6
  556.     BRA    FLINE20
  557.  
  558. ;This is a push operation: We must load a real value such that it will
  559. ; be at the top of the stack after the exception stuff goes away.
  560. ;WARNING: This assumes the exception occurred while in supervisor mode.
  561. EA47    MOVEM.L    (SP),D1/A6    ;MOVE THE EXCEPTION STUFF BACK 8 BYTES
  562.     SUBQ.L    #8,SP
  563.     MOVEM.L    D1/A6,(SP)
  564.     MOVEM.L    16(SP),D1/A6
  565.     MOVEM.L    D1/A6,8(SP)
  566.     MOVE.W    24(SP),16(SP)
  567.     LEA    18(SP),A6    ;POINT TO THE HOLE IN THE STACK
  568.     BRA    FLINE20
  569.  
  570. ;-----------------------------------------------------------------------
  571. ;EFFECTIVE ADDRESS = d(An)
  572. ; RETURN EFFECTIVE ADDRESS IN D1
  573. ;
  574. EA50    MOVE.L    A0,D1
  575.     BRA    FLINE15
  576.  
  577. EA51    MOVE.L    A1,D1
  578.     BRA    FLINE15
  579.  
  580. EA52    MOVE.L    A2,D1
  581.     BRA    FLINE15
  582.  
  583. EA53    MOVE.L    A3,D1
  584.     BRA    FLINE15
  585.  
  586. EA54    MOVE.L    A4,D1
  587.     BRA    FLINE15
  588.  
  589. EA55    MOVE.L    A5,D1
  590.     BRA    FLINE15
  591.  
  592. EA56    MOVE.L    8(SP),D1    ;GET A6 AS SAVED ON THE STACK
  593.     BRA    FLINE15
  594.  
  595. EA57    MOVEQ    #18,D1        ;IF WE WERE IN SUPERVISOR MODE
  596.     ADD.L    SP,D1        ;ADJUST SP TO VALUE BEFORE THE EXCEPTION
  597.     BRA    FLINE15
  598.  
  599. ;EA57    MOVE    USP,D1        ;IF WE WERE IN USER MODE (WON'T WORK IN
  600. ; MOTOROLA'S "ORTHORGONAL" INSTRUCTION SET)
  601. ;    BRA    FLINE15
  602.  
  603. ;-----------------------------------------------------------------------
  604. ;EFFECTIVE ADDRESS = d(An,Xn)
  605. ;
  606. EA60
  607. EA61
  608. EA62
  609. EA63
  610. EA64
  611. EA65
  612. EA66
  613. EA67    JSR    VERROR
  614.     ASCII    '145 - UNIMPLEMENTED ADDR MODE, d(An,Xn'
  615.     DC.B    ')'+$80
  616.     BRA    FLINE90        ;EXIT
  617.  
  618. ;-----------------------------------------------------------------------
  619. ;EFFECTIVE ADDRESS = MISCELLANEA
  620. ;
  621. EA70    MOVEA.L    14(SP),A6    ;(xxx).W
  622.     MOVE.W    (A6)+,D1    ;GET EFFECTIVE ADDRESS INTO D1
  623.     MOVE.L    A6,14(SP)    ;ADJUST RETURN ADDRESS TO SKIP EXTENSION
  624.     MOVEA.W    D1,A6        ;RETURN SIGN EXTENDED <EA> IN A6
  625.     BRA    FLINE20
  626.  
  627. EA71    MOVEA.L    14(SP),A6    ;(xxx).L
  628.     MOVE.L    (A6)+,D1    ;GET EFFECTIVE ADDRESS INTO D1
  629.     MOVE.L    A6,14(SP)    ;ADJUST RETURN ADDRESS TO SKIP EXTENSION
  630.     MOVEA.W    D1,A6        ;RETURN <EA> IN A6
  631.     BRA    FLINE20
  632.  
  633. EA74    MOVEA.L    14(SP),A6    ;#<data>
  634.     ADDQ.L    #8,A6        ;POINT A6 TO END OF IMMEDIATE DATA (+1)
  635.     MOVE.L    A6,14(SP)    ;ADJUST RETURN ADDRESS TO SKIP EXTENSION
  636.     BRA    MOVMR        ;MOVE IMMEDIATE DATA INTO REGISTER
  637.  
  638. EA72                ;d(PC)
  639. EA73                ;d(PC,Xn)
  640. EA75
  641. EA76
  642. EA77    JSR    VERROR
  643.     ASCII    '146 - UNIMPLEMENTED ADDR MOD'
  644.     DC.B    'E'+$80
  645.     BRA    FLINE90        ;EXIT
  646.  
  647. ;=======================================================================
  648. ;FLOAT INSTRUCTION
  649. ; FMOVE.L D0,FP0
  650. ; NOTE THAT THIS ONLY WORKS FOR THE REGISTERS D0 AND FP0 AS SHOW.
  651. ;
  652. FLOAT    MOVE.W    #$003E,FPU3    ;ID BYTE FOR FORMAT 9
  653.     MOVE.W    #$0340,FPU1    ;OPERATION WORD: GEN1 = "MEMORY",
  654.                 ; GEN2 = R0, OP = MOVfi, i = D, f = L
  655.                 ;NOTE: OPERATION WORDS ARE BYTE SWAPPED
  656.     MOVE.W    2(SP),FPU1    ;MOVE D0 INTO FPU1, LOW WORD FIRST
  657.     MOVE.W    (SP),FPU1
  658.  
  659. FLOAT10    BTST    #0,FPUSTAT    ;WAIT FOR OPERATION COMPLETE
  660.     BEQ.S    FLOAT10
  661.  
  662.     BTST    #0,FPU2        ;READ STATUS WORD (MANDATORY)
  663.     BEQ.S    FLOAT90
  664.     JSR    VERROR
  665.     ASCII    '121 - FLOAT (FMOVE.L D0,FP0'
  666.     DC.B    ')'+$80
  667.  
  668. FLOAT90    BRA    FLINE90
  669.  
  670. ;-----------------------------------------------------------------------
  671. ;FIX INSTRUCTION
  672. ; FMOVE.L FP0,D0
  673. ; NOTE THAT THIS ONLY WORKS FOR THE REGISTERS INDICATED.
  674. ;
  675. FIX    MOVE.W    #$003E,FPU3    ;ID BYTE FOR FORMAT 9
  676.     MOVE.W    #$2302,FPU1    ;OPERATION WORD: GEN1 = R0, GEN2 =
  677.                 ; "MEMORY", OP = ROUNDfi, i = D, f = L
  678.                 ;NOTE: OPERATION WORDS ARE BYTE SWAPPED
  679. FIX10    BTST    #0,FPUSTAT    ;WAIT FOR OPERATION COMPLETE
  680.     BEQ.S    FIX10
  681.  
  682.     BTST    #0,FPU2        ;READ STATUS WORD (MANDATORY)
  683.     BEQ.S    FIX20
  684.     JSR    VERROR
  685.     ASCII    '121 - FIX (FMOVE.L FP0,D0'
  686.     DC.B    ')'+$80
  687.  
  688. FIX20    MOVE.W    FPU1,2(SP)    ;MOVE RESULT INTO D0, LOW WORD FIRST
  689.     MOVE.W    FPU1,(SP)
  690.     BRA    FLINE90
  691.  
  692. ;-----------------------------------------------------------------------
  693. ;DOUBLE PRECISION MOVE FROM MEMORY TO A FLOATING-POINT REGISTER
  694. ; FMOVE.D <ea>,FPn
  695. ; INPUTS: A6 - POINTS TO MEMORY LOCATION.
  696. ;      D0 - SECOND WORD OF INSTRUCTION
  697. ; DESTROYS REGISTERS D0 AND A6.
  698. ;
  699. MOVMR    MOVE.L    A5,-(SP)    ;SAVE A5
  700.  
  701.     LSR.W    #6,D0        ;D0 = DESTINATION REGISTER *2
  702.     ANDI.W    #$0006,D0
  703.     LEA    MOVMRTB.L,A5
  704.     MOVE.W    #$00BE,FPU3    ;ID BYTE FOR FORMAT 11
  705.     MOVE.W    0(A5,D0),FPU1    ;LOAD OPERATION WORD FROM TABLE
  706.  
  707.     MOVE.W    -(A6),FPU1    ;MOVE 4-WORD, DOUBLE-PRECISION VALUE
  708.     MOVE.W    -(A6),FPU1    ; STARTING WITH THE LEAST SIGNIFICANT
  709.     MOVE.W    -(A6),FPU1    ; WORD INTO FPU1
  710.     MOVE.W    -(A6),FPU1
  711.  
  712. MOVMR10    BTST    #0,FPUSTAT    ;WAIT FOR OPERATION COMPLETE
  713.     BEQ.S    MOVMR10
  714.  
  715.     BTST    #0,FPU2        ;READ STATUS WORD (MANDATORY)
  716.     BEQ.S    MOVMR90
  717.     JSR    VERROR
  718.     ASCII    '120 - FLOATING MOVE MEM TO RE'
  719.     DC.B    'G'+$80
  720.  
  721. MOVMR90    MOVEA.L    (SP)+,A5
  722.     BRA    FLINE90
  723.  
  724. ;OPERATON WORD TABLE.  NOTE BYTE SWAPPED ORDER.
  725. MOVMRTB    DC.W    $0440        ;R0
  726.     DC.W    $8440        ;R2
  727.     DC.W    $0441        ;R4
  728.     DC.W    $8441        ;R6
  729.  
  730. ;-----------------------------------------------------------------------
  731. ;DOUBLE PRECISION MOVE FROM A FLOATING-POINT REGISTER TO MEMORY
  732. ; FMOVE.D FPm,<ea>
  733. ; INPUTS: A6 - POINTS TO MEMORY LOCATION.
  734. ;      D0 - SECOND WORD OF INSTRUCTION
  735. ; DESTROYS REGISTERS D0 AND A6
  736. ;
  737. MOVRM    MOVE.L    A5,-(SP)    ;SAVE A5
  738.  
  739.     LSR.W    #6,D0        ;D0 = SOURCE REGISTER *2
  740.     ANDI.W    #$0006,D0
  741.     LEA    MOVRMTB.L,A5
  742.     MOVE.W    #$00BE,FPU3    ;ID BYTE FOR FORMAT 11
  743.     MOVE.W    0(A5,D0),FPU1    ;LOAD OPERATION WORD FROM TABLE
  744.  
  745. MOVRM10    BTST    #0,FPUSTAT    ;WAIT FOR OPERATION COMPLETE
  746.     BEQ.S    MOVRM10
  747.  
  748.     BTST    #0,FPU2        ;READ STATUS WORD (MANDATORY)
  749.     BEQ.S    MOVRM20
  750.     JSR    VERROR
  751.     ASCII    '121 - FLOATING MOVE REG TO ME'
  752.     DC.B    'M'+$80
  753.  
  754. MOVRM20    MOVE.W    FPU1,-(A6)    ;READ RESULT, LEAST SIGNIFICANT WORD 1ST
  755.     MOVE.W    FPU1,-(A6)
  756.     MOVE.W    FPU1,-(A6)
  757.     MOVE.W    FPU1,-(A6)
  758.  
  759.     MOVEA.L    (SP)+,A5    ;RESTORE A5
  760.     BRA    FLINE90
  761.  
  762. ;OPERATON WORD TABLE.  NOTE BYTE SWAPPED ORDER.
  763. MOVRMTB    DC.W    $0402        ;R0
  764.     DC.W    $0412        ;R2
  765.     DC.W    $0422        ;R4
  766.     DC.W    $0432        ;R6
  767.  
  768. ;=======================================================================
  769. ;HANDLER FOR UNIMPLEMENTED OR ILLEGAL INSTRUCTIONS
  770. ;
  771. BAD    JSR    VERROR
  772.     ASCII    '130 - UNIMPLEMENTED FLOAT INSTRUCTIO'
  773.     DC.B    'N'+$80
  774.     RTS
  775.  
  776. ;-----------------------------------------------------------------------
  777. ;$00
  778. ;DOUBLE PRECISION MOVE FROM REGISTER TO REGISTER
  779. ; FMOVE FPm,FPn
  780. ; INPUTS: D0 - "GEN" BITS
  781. ; DESTROYS REGISTER D0
  782. ;
  783. MOVE    MOVE.W    #$00BE,FPU3    ;ID BYTE FOR FORMAT 11
  784.     ORI.W    #$0400,D0    ;OR IN "MOVE" OPCODE (BYTE SWAPPED)
  785.     MOVE.W    D0,FPU1        ;LOAD OPERATION WORD
  786.  
  787. MOV0R10    BTST    #0,FPUSTAT    ;WAIT FOR OPERATION COMPLETE
  788.     BEQ.S    MOV0R10
  789.  
  790.     BTST    #0,FPU2        ;READ STATUS WORD (MANDATORY)
  791.     BEQ.S    MOV0R90
  792.     JSR    VERROR
  793.     ASCII    '122 - FLOATING MOVE TO RE'
  794.     DC.B    'G'+$80
  795.  
  796. MOV0R90    BRA    FLINE90
  797.  
  798. ;-----------------------------------------------------------------------
  799. ;$01
  800. ;INTEGER PART
  801. ; FINT FPn
  802. ;
  803. INT    BSR    BAD
  804.     BRA    FLINE90
  805.  
  806. ;-----------------------------------------------------------------------
  807. ;$02
  808. ;HYPERBOLIC SINE
  809. ; FSINH FPn
  810. ;
  811. SINH    BSR    BAD
  812.     BRA    FLINE90
  813.  
  814. ;-----------------------------------------------------------------------
  815. ;$03
  816. ;INTEGER PART, ROUND TO ZERO
  817. ; FINTRZ FPn
  818. ;
  819. INTRZ    BSR    BAD
  820.     BRA    FLINE90
  821.  
  822. ;-----------------------------------------------------------------------
  823. ;$04
  824. ;SQUARE ROOT
  825. ; FSQRT FPn
  826. ;
  827. SQRT    BSR    BAD
  828.     BRA    FLINE90
  829.  
  830. ;-----------------------------------------------------------------------
  831. ;$05
  832. ;LOG TO THE BASE E OF X PLUS 1.  LOGe(X+1)
  833. ; FLOGNP1 FPn
  834. ;
  835. LOGNP1    BSR    BAD
  836.     BRA    FLINE90
  837.  
  838. ;-----------------------------------------------------------------------
  839. ;$08
  840. ;E TO THE X MINUS 1. e^x -1
  841. ; FETOXM1 FPn
  842. ;
  843. ETOXM1    BSR    BAD
  844.     BRA    FLINE90
  845.  
  846. ;-----------------------------------------------------------------------
  847. ;$09
  848. ;HYPERBOLIC TANGENT
  849. ; FTANH FPn
  850. ;
  851. TANH    BSR    BAD
  852.     BRA    FLINE90
  853.  
  854. ;-----------------------------------------------------------------------
  855. ;$0A
  856. ;ARC TANGENT
  857. ; FATAN FPn
  858. ;
  859. ATAN    BSR    BAD
  860.     BRA    FLINE90
  861.  
  862. ;-----------------------------------------------------------------------
  863. ;$0C
  864. ;ARC SINE
  865. ; FASIN FPn
  866. ;
  867. ASIN    BSR    BAD
  868.     BRA    FLINE90
  869.  
  870. ;-----------------------------------------------------------------------
  871. ;$0D
  872. ;HYPERBOLIC ARC TANGENT
  873. ; FATANH FPn
  874. ;
  875. ATANH    BSR    BAD
  876.     BRA    FLINE90
  877.  
  878. ;-----------------------------------------------------------------------
  879. ;$0E
  880. ;SINE
  881. ; FSIN FPn
  882. ;
  883. SIN    BSR    BAD
  884.     BRA    FLINE90
  885.  
  886. ;-----------------------------------------------------------------------
  887. ;$0F
  888. ;TANGENT
  889. ; FTAN FPn
  890. ;
  891. TAN    BSR    BAD
  892.     BRA    FLINE90
  893.  
  894. ;-----------------------------------------------------------------------
  895. ;$10
  896. ;E TO THE X POWER. e^X
  897. ; FETOX FPn
  898. ;
  899. ETOX    BSR    BAD
  900.     BRA    FLINE90
  901.  
  902. ;-----------------------------------------------------------------------
  903. ;$11
  904. ;2^X
  905. ; FTWOTOX FPn
  906. ;
  907. TWOTOX    BSR    BAD
  908.     BRA    FLINE90
  909.  
  910. ;-----------------------------------------------------------------------
  911. ;$12
  912. ;10^X
  913. ; FTENTOX FPn
  914. ;
  915. TENTOX    BSR    BAD
  916.     BRA    FLINE90
  917.  
  918. ;-----------------------------------------------------------------------
  919. ;$14
  920. ;NATURAL LOG. LOG TO THE BASE e
  921. ; FLOGN FPn
  922. ;
  923. LOGN    BSR    BAD
  924.     BRA    FLINE90
  925.  
  926. ;-----------------------------------------------------------------------
  927. ;$15
  928. ;LOG TO THE BASE 10. Log10
  929. ; FLOG10 FPn
  930. ;
  931. LOG10    BSR    BAD
  932.     BRA    FLINE90
  933.  
  934. ;-----------------------------------------------------------------------
  935. ;$16
  936. ;LOG TO THE BASE 2. Log 2
  937. ; FLOG2 FPn
  938. ;
  939. LOG2    BSR    BAD
  940.     BRA    FLINE90
  941.  
  942. ;-----------------------------------------------------------------------
  943. ;$18
  944. ;ABSOLUTE VALUE
  945. ; FABS FPn
  946. ; INPUTS: D0 - "GEN" BITS
  947. ; DESTROYS REGISTER D0
  948. ;
  949. ABS    MOVE.W    #$00BE,FPU3    ;ID BYTE FOR FORMAT 11
  950.     ORI.W    #$3400,D0    ;OR IN "ABS" OPCODE (BYTE SWAPPED)
  951.     MOVE.W    D0,FPU1        ;LOAD OPERATION WORD
  952.  
  953. ABS10    BTST    #0,FPUSTAT    ;WAIT FOR OPERATION COMPLETE
  954.     BEQ.S    ABS10
  955. ;
  956.     BTST    #0,FPU2        ;READ STATUS WORD (MANDATORY)
  957.     BEQ.S    ABS90
  958.     JSR    VERROR
  959.     ASCII    '123 - FLOATING ABSOLUTE VALU'
  960.     DC.B    'E'+$80
  961. ABS90    BRA    FLINE90
  962.  
  963. ;-----------------------------------------------------------------------
  964. ;$19
  965. ;HYPERBOLIC COSINE
  966. ; FCOSH FPn
  967. ;
  968. COSH    BSR    BAD
  969.     BRA    FLINE90
  970.  
  971. ;-----------------------------------------------------------------------
  972. ;$1A
  973. ;NEGATE
  974. ; FNEG FPn
  975. ; INPUTS: D0 - "GEN" BITS
  976. ; DESTROYS REGISTER D0
  977. ;
  978. NEG    MOVE.W    #$00BE,FPU3    ;ID BYTE FOR FORMAT 11
  979.     ORI.W    #$1400,D0    ;OR IN "NEG" OPCODE (BYTE SWAPPED)
  980.     MOVE.W    D0,FPU1        ;LOAD OPERATION WORD
  981.  
  982. NEG10    BTST    #0,FPUSTAT    ;WAIT FOR OPERATION COMPLETE
  983.     BEQ.S    NEG10
  984. ;
  985.     BTST    #0,FPU2        ;READ STATUS WORD (MANDATORY)
  986.     BEQ.S    NEG90
  987.     JSR    VERROR
  988.     ASCII    '124 - FLOATING NEGAT'
  989.     DC.B    'E'+$80
  990. NEG90    BRA    FLINE90
  991.  
  992. ;-----------------------------------------------------------------------
  993. ;$1C
  994. ;ARC COSINE
  995. ; FACOS FPn
  996. ;
  997. ACOS    BSR    BAD
  998.     BRA    FLINE90
  999.  
  1000. ;-----------------------------------------------------------------------
  1001. ;$1D
  1002. ;COSINE
  1003. ; FCOS FPn
  1004. ;
  1005. COS    BSR    BAD
  1006.     BRA    FLINE90
  1007.  
  1008. ;-----------------------------------------------------------------------
  1009. ;$1E
  1010. ;GET EXPONENT
  1011. ; FGETEXP FPn
  1012. ;
  1013. GETEXP    BSR    BAD
  1014.     BRA    FLINE90
  1015.  
  1016. ;-----------------------------------------------------------------------
  1017. ;$1F
  1018. ;GET MANITSSA
  1019. ; FGETMAN FPn
  1020. ;
  1021. GETMAN    BSR    BAD
  1022.     BRA    FLINE90
  1023.  
  1024. ;-----------------------------------------------------------------------
  1025. ;$20
  1026. ;DIVIDE
  1027. ; FDIV FPm,FPn
  1028. ; INPUTS: D0 - "GEN" BITS
  1029. ; DESTROYS REGISTER D0
  1030. ;
  1031. DIV    MOVE.W    #$00BE,FPU3    ;ID BYTE FOR FORMAT 11
  1032.     ORI.W    #$2000,D0    ;OR IN "DIV" OPCODE (BYTE SWAPPED)
  1033.     MOVE.W    D0,FPU1        ;LOAD OPERATION WORD
  1034.  
  1035. DIV10    BTST    #0,FPUSTAT    ;WAIT FOR OPERATION COMPLETE
  1036.     BEQ.S    DIV10
  1037. ;
  1038.     BTST    #0,FPU2        ;READ STATUS WORD (MANDATORY)
  1039.     BEQ.S    DIV90
  1040.     JSR    VERROR
  1041.     ASCII    '125 - FLOATING DIVID'
  1042.     DC.B    'E'+$80
  1043. DIV90    BRA    FLINE90
  1044.  
  1045. ;-----------------------------------------------------------------------
  1046. ;$21
  1047. ;MODULO REMAINDER
  1048. ; FMOD FPm,FPn
  1049. ;
  1050. MOD    BSR    BAD
  1051.     BRA    FLINE90
  1052.  
  1053. ;-----------------------------------------------------------------------
  1054. ;$22
  1055. ;ADD
  1056. ; FADD FPm,FPn
  1057. ; INPUTS: D0 - "GEN" BITS
  1058. ; DESTROYS REGISTER D0
  1059. ;
  1060. ADD    MOVE.W    #$00BE,FPU3    ;ID BYTE FOR FORMAT 11
  1061. ;    ORI.W    #$0000,D0    ;OR IN "ADD" OPCODE (BYTE SWAPPED)
  1062.     MOVE.W    D0,FPU1        ;LOAD OPERATION WORD
  1063.  
  1064. ADD10    BTST    #0,FPUSTAT    ;WAIT FOR OPERATION COMPLETE
  1065.     BEQ.S    ADD10
  1066.  
  1067.     BTST    #0,FPU2        ;READ STATUS WORD (MANDATORY)
  1068.     BEQ.S    ADD90
  1069.     JSR    VERROR
  1070.     ASCII    '126 - FLOATING AD'
  1071.     DC.B    'D'+$80
  1072. ADD90    BRA    FLINE90
  1073.  
  1074. ;-----------------------------------------------------------------------
  1075. ;$23
  1076. ;MULTIPLY
  1077. ; FMUL FPm,FPn
  1078. ; INPUTS: D0 - "GEN" BITS
  1079. ; DESTROYS REGISTER D0
  1080. ;
  1081. MUL    MOVE.W    #$00BE,FPU3    ;ID BYTE FOR FORMAT 11
  1082.     ORI.W    #$3000,D0    ;OR IN "MUL" OPCODE (BYTE SWAPPED)
  1083.     MOVE.W    D0,FPU1        ;LOAD OPERATION WORD
  1084.  
  1085. MUL10    BTST    #0,FPUSTAT    ;WAIT FOR OPERATION COMPLETE
  1086.     BEQ.S    MUL10
  1087.  
  1088.     BTST    #0,FPU2        ;READ STATUS WORD (MANDATORY)
  1089.     BEQ.S    MUL90
  1090.     JSR    VERROR
  1091.     ASCII    '127 - FLOATING MULTIPL'
  1092.     DC.B    'Y'+$80
  1093. MUL90    BRA    FLINE90
  1094.  
  1095. ;-----------------------------------------------------------------------
  1096. ;$24
  1097. ;SINGLE PRECISION DIVIDE
  1098. ; FSGLDIV FPm,FPn
  1099. ;
  1100. SGLDIV    BSR    BAD
  1101.     BRA    FLINE90
  1102.  
  1103. ;-----------------------------------------------------------------------
  1104. ;$25
  1105. ;IEEE REMAINDER
  1106. ; FREM FPm,FPn
  1107. ;
  1108. REM    BSR    BAD
  1109.     BRA    FLINE90
  1110.  
  1111. ;-----------------------------------------------------------------------
  1112. ;$26
  1113. ;SCALE EXPONENT
  1114. ; FSCALE FPm,FPn
  1115. ;
  1116. SCALE    BSR    BAD
  1117.     BRA    FLINE90
  1118.  
  1119. ;-----------------------------------------------------------------------
  1120. ;$27
  1121. ;SINGLE PRECISION MULTIPLY
  1122. ; FSGLMUL FPm,FPn
  1123. ;
  1124. SGLMUL    BSR    BAD
  1125.     BRA    FLINE90
  1126.  
  1127. ;-----------------------------------------------------------------------
  1128. ;$28
  1129. ;SUBTRACT
  1130. ; FSUB FPm,FPn
  1131. ; INPUTS: D0 - "GEN" BITS
  1132. ; DESTROYS REGISTER D0
  1133. ;
  1134. SUB    MOVE.W    #$00BE,FPU3    ;ID BYTE FOR FORMAT 11
  1135.     ORI.W    #$1000,D0    ;OR IN "SUB" OPCODE (BYTE SWAPPED)
  1136.     MOVE.W    D0,FPU1        ;LOAD OPERATION WORD
  1137.  
  1138. SUB10    BTST    #0,FPUSTAT    ;WAIT FOR OPERATION COMPLETE
  1139.     BEQ.S    SUB10
  1140.  
  1141.     BTST    #0,FPU2        ;READ STATUS WORD (MANDATORY)
  1142.     BEQ.S    SUB90
  1143.     JSR    VERROR
  1144.     ASCII    '128 - FLOATING SUBTRAC'
  1145.     DC.B    'T'+$80
  1146. SUB90    BRA    FLINE90
  1147.  
  1148. ;-----------------------------------------------------------------------
  1149. ;$30
  1150. ;SIMUTANEOUS SINE AND COSINE
  1151. ; FSINCOS FPm,FPc:FPs
  1152. ;
  1153. SINCOS    BSR    BAD
  1154.     BRA    FLINE90
  1155.  
  1156. ;-----------------------------------------------------------------------
  1157. ;$38
  1158. ;COMPARE FPn TO FPm 
  1159. ; FCMP FPm,FPn
  1160. ; INPUTS: D0 - "GEN" BITS
  1161. ; DESTROYS REGISTER D0
  1162. ; THIS IS A KLUDGE: THE 68881 DOES NOT ACTUALLY SET THE CONDITION CODES
  1163. ; IN THE 68020.
  1164. ;
  1165. CMP    MOVE.W    #$00BE,FPU3    ;ID BYTE FOR FORMAT 11
  1166.     ORI.W    #$0800,D0    ;OR IN "CMP" OPCODE (BYTE SWAPPED)
  1167.     MOVE.W    D0,FPU1        ;LOAD OPERATION WORD
  1168.  
  1169. CMP10    BTST    #0,FPUSTAT    ;WAIT FOR OPERATION COMPLETE
  1170.     BEQ.S    CMP10
  1171.  
  1172.     MOVE.W    FPU2,D0        ;READ STATUS *WORD* (MANDATORY)
  1173.     BTST    #0,D0
  1174.     BRA.S    CMP20        ;IGNORE ERROR CONDITION
  1175. ;    BEQ.S    CMP20
  1176.     JSR    VERROR
  1177.     ASCII    '128 - FLOATING COMPAR'
  1178.     DC.B    'E'+$80
  1179.  
  1180. CMP20    ANDI.B    #$C0,D0        ;GET STATUS BITS 7=N, 6=Z
  1181.     LSR.B    #4,D0        ;SHIFT DOWN TO 3=N, 2=Z
  1182.     MOVE.B    D0,13(SP)    ;PUT IN STATUS REGISTER (VIA STACK)
  1183.     BRA    FLINE90        ;OTHER CONDITION BITS (X, V, C) ARE 0
  1184.  
  1185. ;-----------------------------------------------------------------------
  1186. ;$3A
  1187. ;TEST OPERAND
  1188. ; FTST FPm
  1189. ;
  1190. TST    BSR    BAD
  1191.     BRA    FLINE90
  1192.  
  1193.     END
  1194. ------------------------------------------------------
  1195. ;$3A
  1196. ;TEST OPERAND
  1197. ; FTST FPm
  1198. ;
  1199. TST    BSR    BAD
  1200.     BRA    FLINE90
  1201.  
  1202.     EN